# 替代方案：不依赖SDK，用requests手动发送
# utils/ronglian.py（最顶部添加）
import warnings
from urllib3.exceptions import InsecureRequestWarning
import requests
import time
import hashlib
from django.conf import settings
import base64

# 抑制未验证HTTPS请求的警告
warnings.filterwarnings('ignore', category=InsecureRequestWarning)

def send_sms_by_requests(phone, code):
    # 容联云接口配置（原有逻辑不变）
    account_sid = settings.RONG_LIAN["ACCOUNT_SID"]
    auth_token = settings.RONG_LIAN["AUTH_TOKEN"]
    app_id = settings.RONG_LIAN["APP_ID"]
    template_id = settings.RONG_LIAN["TEMPLATE_ID"]
    server_ip = settings.RONG_LIAN["SERVER_IP"]  # 建议用官方默认：app.cloopen.com
    server_port = settings.RONG_LIAN["SERVER_PORT"]  # 官方默认：8883
    soft_version = settings.RONG_LIAN["SOFT_VERSION"]  # 官方默认：2013-12-26

    # 1. 生成时间戳（精确到分钟，与Authorization中一致）
    timestamp = time.strftime("%Y%m%d%H%M%S")  # 格式：20251104163000

    # 2. 按规范生成 sig（关键修复）
    # 规则：MD5(AccountSid + AuthToken + Timestamp) → 转大写
    sig_raw = f"{account_sid}{auth_token}{timestamp}"  # 严格按此顺序拼接
    sig = hashlib.md5(sig_raw.encode("utf-8")).hexdigest().upper()  # 必须转大写

    # 3. 生成 Authorization（确保 Timestamp 与 sig 一致）
    auth_str = f"{account_sid}:{timestamp}"
    authorization = base64.b64encode(auth_str.encode()).decode()

    # 4. 接口 URL（确保 sig 正确拼接）
    url = (
        f"https://{server_ip}:{server_port}/{soft_version}/Accounts/{account_sid}/SMS/TemplateSMS"
        f"?sig={sig}"  # 拼接 sig 到 URL 参数
    )

    # 5. 请求头（原有逻辑不变，包含 Authorization）
    headers = {
        "Accept": "application/json",
        "Content-Type": "application/json;charset=utf-8",
        "Authorization": authorization
    }

    # 6. 请求体（原有逻辑不变）
    body = {
        "to": phone,
        "appId": app_id,
        "templateId": template_id,
        "datas": [code, "10"]
    }

    # 发送请求并打印日志（原有逻辑不变）
    try:
        response = requests.post(url, json=body, headers=headers, verify=False)
        result = response.json()
        print(f"容联云接口返回：{result}")
        return result.get("statusCode") == "000000"
    except Exception as e:
        print(f"短信发送失败（异常）：{str(e)}")
        return False